package com.aspire.aimini.repository;

import com.aspire.aimini.model.entity.Copywriting;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 文案Repository接口
 *
 * @author wangguiyou
 * @date 2024-01-01
 * @description 文案数据访问层接口
 */
@Mapper
public interface CopywritingRepository extends BaseMapper<Copywriting> {

    /**
     * 分页查询文案列表
     *
     * @param page        分页对象
     * @param userId      用户ID
     * @param materialId  素材ID
     * @param contentType 内容类型
     * @param style       风格
     * @param aiModel     AI模型
     * @param isFavorite  是否收藏
     * @param keyword     搜索关键词
     * @param sortBy      排序字段
     * @param sortOrder   排序方向
     * @param startTime   开始时间
     * @param endTime     结束时间
     * @return 分页结果
     */
    IPage<Copywriting> selectCopywritingPage(
            Page<Copywriting> page,
            @Param("userId") Long userId,
            @Param("materialId") Long materialId,
            @Param("contentType") String contentType,
            @Param("style") String style,
            @Param("aiModel") String aiModel,
            @Param("isFavorite") Boolean isFavorite,
            @Param("keyword") String keyword,
            @Param("sortBy") String sortBy,
            @Param("sortOrder") String sortOrder,
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime);

    /**
     * 根据素材ID查询文案列表
     *
     * @param materialId 素材ID
     * @param userId     用户ID
     * @return 文案列表
     */
    List<Copywriting> selectByMaterialId(@Param("materialId") Long materialId, @Param("userId") Long userId);

    /**
     * 根据素材ID统计文案数量
     *
     * @param materialId 素材ID
     * @param userId     用户ID
     * @return 文案数量
     */
    Long countByMaterialId(@Param("materialId") Long materialId, @Param("userId") Long userId);

    /**
     * 增加文案使用次数
     *
     * @param id 文案ID
     */
    void incrementUseCount(@Param("id") Long id);

    /**
     * 批量删除文案
     *
     * @param ids    文案ID列表
     * @param userId 用户ID
     * @return 删除数量
     */
    int batchDelete(@Param("ids") List<Long> ids, @Param("userId") Long userId);

    /**
     * 根据素材ID删除所有文案
     *
     * @param materialId 素材ID
     * @param userId     用户ID
     * @return 删除数量
     */
    int deleteByMaterialId(@Param("materialId") Long materialId, @Param("userId") Long userId);

    /**
     * 统计用户文案数量
     *
     * @param userId 用户ID
     * @return 文案数量
     */
    Long countByUserId(@Param("userId") Long userId);

    /**
     * 查询用户收藏文案列表
     *
     * @param page   分页对象
     * @param userId 用户ID
     * @return 分页结果
     */
    IPage<Copywriting> selectFavoritesByUserId(Page<Copywriting> page, @Param("userId") Long userId);

    /**
     * 查询最近创建的文案
     *
     * @param userId 用户ID
     * @param limit  限制数量
     * @return 文案列表
     */
    List<Copywriting> selectRecentCopywriting(@Param("userId") Long userId, @Param("limit") Integer limit);

    /**
     * 根据内容类型统计文案数量
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countByContentType(@Param("userId") Long userId);

    /**
     * 根据风格统计文案数量
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countByStyle(@Param("userId") Long userId);

    /**
     * 根据AI模型统计文案数量
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countByAiModel(@Param("userId") Long userId);

    /**
     * 查询热门文案(根据使用次数)
     *
     * @param limit 限制数量
     * @return 文案列表
     */
    List<Copywriting> selectPopularCopywriting(@Param("limit") Integer limit);

    /**
     * 模糊搜索文案
     *
     * @param keyword 关键词
     * @param userId  用户ID
     * @param limit   限制数量
     * @return 文案列表
     */
    List<Copywriting> searchCopywriting(@Param("keyword") String keyword, @Param("userId") Long userId,
            @Param("limit") Integer limit);

    /**
     * 统计用户每日文案生成数量
     *
     * @param userId 用户ID
     * @param days   天数
     * @return 统计结果
     */
    List<Map<String, Object>> countDailyCopywriting(@Param("userId") Long userId, @Param("days") Integer days);

    /**
     * 清理过期的临时文案
     *
     * @param expiredTime 过期时间
     * @return 清理数量
     */
    int cleanExpiredTempCopywriting(@Param("expiredTime") LocalDateTime expiredTime);
}